C ++ में इनलाइन फ़ंक्शंस
इनलाइन फ़ंक्शन C ++ की महत्वपूर्ण विशेषता में से एक है। तो, आइए पहले समझते हैं कि इनलाइन फ़ंक्शन का उपयोग क्यों किया जाता है और इनलाइन फ़ंक्शन का उद्देश्य क्या है?
जब फ़ंक्शन फ़ंक्शन कॉल निर्देश को निष्पादित करता है, तो सीपीयू फ़ंक्शन कॉल के बाद अनुदेश के मेमोरी पते को संग्रहीत करता है, फ़ंक्शन के तर्कों को स्टैक पर कॉपी करता है और अंत में निर्दिष्ट फ़ंक्शन पर नियंत्रण स्थानांतरित करता है। तब CPU फ़ंक्शन कोड को निष्पादित करता है, फ़ंक्शन रिटर्न मान को पूर्वनिर्धारित मेमोरी लोकेशन / रजिस्टर में संग्रहीत करता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटाता है। यह ओवरहेड बन सकता है यदि फ़ंक्शन का निष्पादन समय कॉलर फ़ंक्शन से फ़ंक्शन (कॉलली) को स्विच करने के समय से कम है। ऐसे फ़ंक्शन के लिए जो बड़े और / या जटिल कार्य करते हैं, फ़ंक्शन कॉल के ओवरहेड आमतौर पर कार्य को चलाने के समय की मात्रा की तुलना में महत्वहीन होता है। हालांकि, छोटे, आमतौर पर उपयोग किए जाने वाले कार्यों के लिए, फ़ंक्शन कॉल करने के लिए आवश्यक समय वास्तव में फ़ंक्शन के कोड को निष्पादित करने के लिए आवश्यक समय से बहुत अधिक है। यह ओवरहेड छोटे कार्यों के लिए होता है क्योंकि छोटे फ़ंक्शन का निष्पादन समय स्विचिंग समय से कम होता है।
C ++ फ़ंक्शन कॉल ओवरहेड को कम करने के लिए एक इनलाइन फ़ंक्शन प्रदान करता है। इनलाइन फ़ंक्शन एक फ़ंक्शन है जिसे लाइन में विस्तारित किया जाता है जब इसे कहा जाता है। जब इनलाइन फ़ंक्शन को इनलाइन फ़ंक्शन का पूरा कोड कहा जाता है, तो इनलाइन फ़ंक्शन कॉल के बिंदु पर सम्मिलित या प्रतिस्थापित किया जाता है। यह प्रतिस्थापन C ++ कंपाइलर द्वारा संकलित समय पर किया जाता है। यदि यह छोटा है तो इनलाइन फ़ंक्शन दक्षता बढ़ा सकता है।
The syntax for defining the function inline is:
inline return-type function-name(parameters)
{
// function code
}
याद रखें, इनलाइनर केवल कंपाइलर से अनुरोध है, कमांड नहीं। कंपाइलर इनलाइनिंग के अनुरोध को अनदेखा कर सकता है। कंपाइलर ऐसी परिस्थितियों में इनलाइनिंग नहीं कर सकता है जैसे:
1) यदि किसी फ़ंक्शन में एक लूप होता है। (के लिए, जबकि, करते हुए)
2) यदि किसी फ़ंक्शन में स्थिर चर हैं।
3) यदि कोई फ़ंक्शन पुनरावर्ती है।
4) यदि कोई फ़ंक्शन रिटर्न प्रकार शून्य के अलावा है, और रिटर्न स्टेटमेंट फ़ंक्शन बॉडी में मौजूद नहीं है।
5) यदि किसी फंक्शन में स्विच या गोटो स्टेटमेंट होता है।
इनलाइन कार्य निम्नलिखित लाभ प्रदान करते हैं:
1) फ़ंक्शन कॉल ओवरहेड नहीं होता है।
2) यह फ़ंक्शन को कॉल करने पर स्टैक पर पुश / पॉप चर के ओवरहेड को भी बचाता है।
3) यह एक फ़ंक्शन से रिटर्न कॉल के ओवरहेड को भी बचाता है।
4) जब आप किसी फ़ंक्शन को इनलाइन करते हैं, तो आप कंपाइलर को फ़ंक्शन के शरीर पर संदर्भ विशिष्ट अनुकूलन करने में सक्षम कर सकते हैं। सामान्य फ़ंक्शन कॉल के लिए ऐसी अनुकूलन संभव नहीं हैं। अन्य अनुकूलन को कॉलिंग संदर्भ के प्रवाह और तथाकथित संदर्भ पर विचार करके प्राप्त किया जा सकता है।
5) इनलाइन फ़ंक्शन एम्बेडेड सिस्टम के लिए उपयोगी हो सकता है (यदि यह छोटा है) क्योंकि इनलाइन फ़ंक्शन कॉल प्रस्तावना और वापसी की तुलना में इनलाइन कम कोड प्राप्त कर सकता है।
इनलाइन फ़ंक्शन नुकसान:
1) इनलाइन फ़ंक्शन से जोड़े गए चर अतिरिक्त रजिस्टरों का उपभोग करते हैं, इन-लाइनिंग फ़ंक्शन के बाद यदि चर संख्या जो रजिस्टर उपयोग का उपयोग करने जा रहे हैं, तो वे रजिस्टर चर संसाधन उपयोग पर ओवरहेड बना सकते हैं। इसका मतलब है कि जब इनलाइन फ़ंक्शन बॉडी को फ़ंक्शन कॉल के बिंदु पर प्रतिस्थापित किया जाता है, तो फ़ंक्शन द्वारा उपयोग किए जाने वाले कुल चर भी सम्मिलित हो जाते हैं। इसलिए चरों के लिए उपयोग किए जाने वाले रजिस्टर की संख्या भी बढ़ जाएगी। इसलिए यदि फंक्शन के बाद इनरॉलिंग चर संख्या में अत्यधिक वृद्धि होती है, तो यह निश्चित रूप से रजिस्टर उपयोग पर एक ओवरहेड का कारण होगा।
2) यदि आप बहुत सारे इनलाइन फ़ंक्शन का उपयोग करते हैं तो बाइनरी एक्ज़ीक्यूटेबल फ़ाइल का आकार बड़ा होगा, क्योंकि समान कोड के दोहराव के कारण।
3) बहुत ज्यादा इनलाइनिंग आपके अनुदेश कैश हिट दर को भी कम कर सकती है, इस प्रकार कैश मेमोरी से इंस्ट्रक्शन की गति को कम करके प्राथमिक मेमोरी की है।
4) इनलाइन फ़ंक्शन कंपाइल टाइम ओवरहेड को बढ़ा सकता है यदि कोई इनलाइन फ़ंक्शन के अंदर कोड को बदलता है तो सभी कॉलिंग लोकेशन को फिर से संकलित करना होगा क्योंकि कंपाइलर को परिवर्तनों को प्रतिबिंबित करने के लिए एक बार फिर से सभी कोड को बदलने की आवश्यकता होगी, अन्यथा यह पुरानी कार्यक्षमता के साथ जारी रहेगा। ।
5) इनलाइन फ़ंक्शन कई एम्बेडेड सिस्टम के लिए उपयोगी नहीं हो सकते हैं। क्योंकि एम्बेडेड सिस्टम में कोड का आकार गति से अधिक महत्वपूर्ण है।
6) इनलाइन फ़ंक्शन थ्रैशिंग का कारण बन सकते हैं क्योंकि इनलाइनिंग बाइनरी एक्ज़ीक्यूटेबल फ़ाइल का आकार बढ़ा सकती है। मेमोरी में गड़बड़ी कंप्यूटर के प्रदर्शन को नीचा दिखाने का कारण बनती है।
The following program demonstrates the use of use of inline function.
#include <iostream>
using namespace std;
inline int cube(int s)
{
return s*s*s;
}
int main()
{
cout << "The cube of 3 is: " << cube(3) << "\n";
return 0;
} //Output: The cube of 3 is: 27
इनलाइन फ़ंक्शन और कक्षाएं:
कक्षा के अंदर इनलाइन फ़ंक्शन को परिभाषित करना भी संभव है। वास्तव में, वर्ग के अंदर परिभाषित सभी फ़ंक्शन अंतर्निहित रूप से इनलाइन हैं। इस प्रकार, इनलाइन फ़ंक्शन के सभी प्रतिबंध भी यहां लागू होते हैं। यदि आपको कक्षा में इनलाइन फ़ंक्शन को स्पष्ट रूप से घोषित करने की आवश्यकता है, तो क्लास के अंदर फ़ंक्शन को घोषित करें और इनलाइन कीवर्ड का उपयोग करके कक्षा के बाहर परिभाषित करें।
उदाहरण के लिए:
class S
{
public:
inline int square(int s) // redundant use of inline
{
// this function is automatically inline
// function body
}
};
उपरोक्त शैली को एक खराब प्रोग्रामिंग शैली माना जाता है। सबसे अच्छी प्रोग्रामिंग शैली केवल कक्षा के अंदर फ़ंक्शन के प्रोटोटाइप को लिखना है और इसे फ़ंक्शन परिभाषा में इनलाइन के रूप में निर्दिष्ट करना है।
For example:
class S
{
public:
int square(int s); // declare the function
};
inline int S::square(int s) // use inline prefix
{
}
The following program demonstrates this concept:
#include <iostream> using namespace std; class operation { int a,b,add,sub,mul; float div; public: void get(); void sum(); void difference(); void product(); void division(); }; inline void operation :: get() { cout << "Enter first value:"; cin >> a; cout << "Enter second value:"; cin >> b; } inline void operation :: sum() { add = a+b; cout << "Addition of two numbers: " << a+b << "\n"; } inline void operation :: difference() { sub = a-b; cout << "Difference of two numbers: " << a-b << "\n"; } inline void operation :: product() { mul = a*b; cout << "Product of two numbers: " << a*b << "\n"; } inline void operation ::division() { div=a/b; cout<<"Division of two numbers: "<<a/b<<"\n" ; } int main() { cout << "Program using inline function\n"; operation s; s.get(); s.sum(); s.difference(); s.product(); s.division(); return 0; } |
0 Comments